bitkeeper revision 1.398.1.1 (3f574c9bvb7h-rdW1pP-v5Bw9t2j7g)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Thu, 4 Sep 2003 14:30:51 +0000 (14:30 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Thu, 4 Sep 2003 14:30:51 +0000 (14:30 +0000)
dummy.c:
  new file
dev.c, kernel.c:
  Allow Xen to work when no NIC is detected.

.rootkeys
xen/common/kernel.c
xen/drivers/net/dummy.c [new file with mode: 0644]
xen/net/dev.c

index d663280b4b44e2d67cb7f069aa66b37172658acc..9653dd7587d894774a7b25eccecc004b316f1e8b 100644 (file)
--- a/.rootkeys
+++ b/.rootkeys
 3ddb79c0tWiE8xIFHszxipeVCGKTSA xen/drivers/net/Makefile
 3f0c4247730LYUgz3p5ziYqy-s_glw xen/drivers/net/SUPPORTED_CARDS
 3ddb79bfU-H1Hms4BuJEPPydjXUEaQ xen/drivers/net/Space.c
+3f574c95CQT9g-GDSJJ4YqiwCEQ72Q xen/drivers/net/dummy.c
 3f0c428e41JP96bh-J0jnX59vJyUeQ xen/drivers/net/e100/LICENSE
 3f0c428es_xrZnnZQXXHhjzuqj9CTg xen/drivers/net/e100/Makefile
 3f0c428eCEnifr-r6XCZKUkzIEHdYw xen/drivers/net/e100/e100.h
index 10a7555eee47d3cfcee3c8795623640f1f9e309f..cc7081471827f388af5dd14be0d049a2b18bb613 100644 (file)
@@ -570,7 +570,9 @@ long do_console_write(char *str, unsigned int count)
     spin_unlock_irqrestore(&console_lock, flags);
     
     exported_str[j++]='\0';
-    console_export(exported_str, j);
+    
+    if ( current->domain != 0 )
+        console_export(exported_str, j);
     
     return(0);
 }
diff --git a/xen/drivers/net/dummy.c b/xen/drivers/net/dummy.c
new file mode 100644 (file)
index 0000000..d0d1976
--- /dev/null
@@ -0,0 +1,79 @@
+/******************************************************************************
+ * dummy.c
+ * 
+ * A cut down version of Linux's dummy network driver. GPLed and all that.
+ */
+
+#include <xeno/config.h>
+#include <xeno/module.h>
+#include <xeno/kernel.h>
+#include <xeno/netdevice.h>
+#include <xeno/init.h>
+
+static int dummy_xmit(struct sk_buff *skb, struct net_device *dev);
+static struct net_device_stats *dummy_get_stats(struct net_device *dev);
+
+static int __init dummy_init(struct net_device *dev)
+{
+    dev->priv = kmalloc(sizeof(struct net_device_stats), GFP_KERNEL);
+    if ( dev->priv == NULL )
+        return -ENOMEM;
+    memset(dev->priv, 0, sizeof(struct net_device_stats));
+
+    dev->get_stats       = dummy_get_stats;
+    dev->hard_start_xmit = dummy_xmit;
+
+    ether_setup(dev);
+    dev->flags          |= IFF_NOARP;
+    dev->features        = NETIF_F_SG | NETIF_F_HIGHDMA;
+
+    return 0;
+}
+
+static int dummy_xmit(struct sk_buff *skb, struct net_device *dev)
+{
+    struct net_device_stats *stats = dev->priv;
+
+    stats->tx_packets++;
+    stats->tx_bytes += skb->len;
+
+    dev_kfree_skb(skb);
+
+    return 0;
+}
+
+static struct net_device_stats *dummy_get_stats(struct net_device *dev)
+{
+    return dev->priv;
+}
+
+static struct net_device dev_dummy;
+
+static int __init dummy_init_module(void)
+{
+    int err;
+
+    dev_dummy.init = dummy_init;
+    SET_MODULE_OWNER(&dev_dummy);
+
+    if ( (err = dev_alloc_name(&dev_dummy,"dummy")) < 0 )
+        return err;
+    
+    if ( (err = register_netdev(&dev_dummy)) < 0 )
+        return err;
+
+    return 0;
+}
+
+static void __exit dummy_cleanup_module(void)
+{
+    unregister_netdev(&dev_dummy);
+    kfree(dev_dummy.priv);
+
+    memset(&dev_dummy, 0, sizeof(dev_dummy));
+    dev_dummy.init = dummy_init;
+}
+
+module_init(dummy_init_module);
+module_exit(dummy_cleanup_module);
+MODULE_LICENSE("GPL");
index 54b73bbf0ab3758349469a6c5a7069b18fa8ec26..c00994e6a1f0b0fd3dbfeeebf53e6f995b0b4a06 100644 (file)
@@ -2145,20 +2145,25 @@ int setup_network_devices(void)
 {
     int i, ret;
     extern char opt_ifname[];
-    struct net_device *dev = dev_get_by_name(opt_ifname);
+    struct net_device *dev;
 
-    if ( dev == NULL ) 
+    if ( (dev = dev_get_by_name(opt_ifname)) == NULL ) 
     {
-        printk("Could not find device %s\n", opt_ifname);
-        return 0;
+        printk("Could not find device %s: using dummy device\n", opt_ifname);
+        strcpy(opt_ifname, "dummy");
+        if ( (dev = dev_get_by_name(opt_ifname)) == NULL )
+        {
+            printk("Failed to find the dummy device!\n");
+            return 0;
+        }
     }
 
-    ret = dev_open(dev);
-    if ( ret != 0 )
+    if ( (ret = dev_open(dev)) != 0 )
     {
         printk("Error opening device %s for use (%d)\n", opt_ifname, ret);
         return 0;
     }
+
     printk("Device %s opened and ready for use.\n", opt_ifname);
     the_dev = dev;